一个简单的取就近的五分钟的整数倍的日期

做项目的时候遇到的一个问题,要去离目前时间最近的五分钟的、三十分钟的、两个小时的、一天的整数倍的这个时间。好像叙述不明白了,那我就举两个栗子吧(栗子好吃~):
现在时间是2016-11-23 14:34,取最近的五分钟的整数倍的时间就是2016-11-23 14:30,三十分钟的…就是2016-11-23 14:30,两个小时的…就是2016-11-23 14:00,一天的…就是2016-11-23 00:00。
如果换成现在的时间是2016-11-23 15:37,取最近的五分钟的…就是2016-11-23 15:35,三十分钟的…就是2016-11-23 15:30,两个小时的…就是2016-11-23 14:00,一天的…就是2016-11-23 00:00。
听着好复杂啊,下面看代码吧。下面的方法是我刚开始写的最近的五分钟的整数倍的时间:

/**
     * 根据date返回最近5的倍数的dateFormat格式的字符串
     * @param date
     * @param dateFormat
     * @return
     */
    public static String getcloseFiveTimes(Date date, String dateFormat){
        DateFormat df = new SimpleDateFormat(dateFormat);
        String time = df.format(date);
        int v =  Integer.parseInt(String.valueOf(time.charAt(11)));
        if(v==1 |v==2 |v==3 | v==4 |v==0  ){
            time = time.substring(0, 11)+"0";
        }else {
            time = time.substring(0, 11)+"5";
        }
        return time;
    }
感觉好low,而且三十分钟的时候遇到了问题逻辑会更加复杂。。。冥想。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。取余?1970年01月01日00时00分00秒?试一试:
    /**
     * 自己才知道的方法,说了你也不懂
     * @param dateFormat
     * @param date
     * @param min
     * @return
     */
    public static String getCloseDate(String dateFormat, Date date, int min){
        long dateTime = date.getTime();
        long needTime = dateTime-dateTime%(min*60*1000);
        return new SimpleDateFormat(dateFormat).format(new Date(needTime));
    }

测试:

public static void main(String a[]) {
        try {
            System.out.println(getCloseDate("yyyyMMddHHmm", new Date(), 5));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

不多说了,继续码代码了。。


出错了,修改。。。。。。。。

/**
     * 
     * @param dateFormat 要转换的字符串类型
     * @param date 时间
     * @param min 多少分钟的整数倍
     * @return
     * @throws Exception 
     */
    public static String getCloseDate(String dateFormat, Date date, long min) throws Exception{
        long dateTime = date.getTime();
        System.out.println(dateTime);
        long needTime =0;
        if(min>=8*60){
            return new SimpleDateFormat(dateFormat).format(getMinDate(date));
        }else{
            needTime = dateTime-dateTime%(min*60L*1000L);
        }
        return new SimpleDateFormat(dateFormat).format(new Date(needTime));
    }
/**
     * 取当前日期的年月日
     * 
     * @param format
     *            格式(如:yyyy-MM-dd)
     * @return
     * @throws ParseException 
     */
    public static Date getMinDate(Date date) throws ParseException {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        Date newDate = sdf.parse(sdf.format(date));
        return newDate;
    }

昨天太忙,今天过来补充一下昨天的错误原因:时区的问题,北京时间和零时区差八个小时所以代码中如果大于八个小时取余就会有问题。(时区貌似是jvm设定好的,具体什么机制还有待研究,学习之后会补充上去。最近好忙。。)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要将切片中的点就近连接成一个封闭多边形,可以使用凸包算法。凸包算法可以找到一组点,使得这组点能够围成凸多边形,而所有其他点都在这个凸多边形的内部。 在 Python 中,可以使用 SciPy 库中的 ConvexHull 函数来实现凸包算法。具体步骤如下: 1. 将切片中的点按照 x 坐标从小到大进行排序。 2. 使用 ConvexHull 函数对排序后的点进行凸包计算,得到凸包的点集。 3. 将凸包的点集连接成一个封闭多边形。 4. 使用多边形面积计算公式计算多边形的面积。 示例代码如下: ```python from scipy.spatial import ConvexHull import numpy as np # 假设切片中的点保存在一个二维数组中 points = np.array([[1, 2], [3, 4], [5, 6], [7, 8], [2, 6], [8, 4]]) # 按照 x 坐标从小到大进行排序 points = points[np.argsort(points[:, 0])] # 计算凸包 hull = ConvexHull(points) # 获凸包的点集 vertices = hull.vertices # 将凸包的点集连接成一个封闭多边形 polygon = np.concatenate((points[vertices], [points[vertices[0]]])) # 计算多边形的面积 area = 0.5 * np.abs(np.dot(polygon[:, 0], np.roll(polygon[:, 1], 1)) - np.dot(polygon[:, 1], np.roll(polygon[:, 0], 1))) print(area) ``` 这段代码中,我们首先将切片中的点按照 x 坐标从小到大进行排序,然后使用 ConvexHull 函数计算凸包。计算完成后,我们获凸包的点集,将其连接成一个封闭多边形,最后使用多边形面积计算公式计算多边形的面积。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值